#pragma once
#ifndef SM2_H
#define SM2_H
// #include<stdint.h>
#include "stdint.h"
#include "pointoperation.h"
// 定义点
typedef struct Param
{
	mpz_t p; // 模数
	mpz_t a; // 一次项系数
	mpz_t b; // 常数项
	mpz_t n; // 阶
} param[1], *param_ptr;

// 参数初始化和释放
/**
 * 参数的初始化.
 */
void sm2_param_init(param sm2_param);

/**
 * 参数空间的释放.
 */
void sm2_param_clear(param sm2_param);

// 1.密钥生成
/**
 * 使用私钥生成公钥.
 */
void public_key_gen(point public_key, mpz_t private_key, param sm2_param, point base_point);

// 2.SM2加密
void sm2_encrypt(uint8_t *ct, size_t ct_len, param sm2_param, point public_key, point base_point, uint8_t *msg, size_t msg_len);

// 3.SM3解密
void sm2_decrypt(uint8_t *plaintext, size_t plaintext_len, param sm2_param, mpz_t private_key, uint8_t *ct, size_t ct_len);

// 4.其他函数

void mpz_to_byte_array(unsigned char *byte_array, size_t size, mpz_t value);

/**
 * 将mpz转换为固定位数的字符串.
 *
 * \param num mpz格式的数
 * \param length 输出的字符串的长度
 * \param base 基数
 * \return
 */
void mpz_to_fixed_length_str(char *padded_str, size_t padded_str_len, mpz_t num, int base);

#endif
